/*
 * @Author: greyqiu greyqiu@163.com
 * @Date: 2025-03-12 17:07:30
 * @LastEditors: greyqiu greyqiu@163.com
 * @LastEditTime: 2025-03-17 14:08:35
 * @Description: 
 * Copyright (c) 2025 by ${greyqiu}, All Rights Reserved. 
 */

#ifndef APP_COMM_COM_TRANSPORT_H_
#define APP_COMM_COM_TRANSPORT_H_

#include "stdint.h"

#define TIME_OUT_TH     3 // 3ms接收超时 认为一帧完成

typedef uint16_t (*CallbackFunc)(uint16_t addr);

typedef enum MB_MST_STA {
    MB_MST_IDLE = 0,
    MB_MST_START, // 开始请求
    MB_MST_WATI,  // 等待响应
    MB_MST_OVER   // 响应结束
} MstSta;

typedef struct {
    MstSta  rxSta;          // 接收状态
    MstSta  txSta;          // 发送状态
    uint8_t *rxBuf;        // 接收BUFFER地址
    uint8_t *txBuf;        // 发送BUFFER地址

    uint16_t rxBufSize;       // 接收最大长度
    uint16_t txBufSize;       // 发送最大长度
    uint16_t readAddr;       // 读操作的寄存器地址

    uint16_t rxNum;          // 已接收字节数
    uint16_t txNum;          // 要发送字节数
    uint16_t txCnt;          // 已发送字节计数

    uint16_t timeOutTh;      // 接收超时判断阈值
    uint16_t timeOutCnt;     // 接收超时计数器
    uint16_t timeOutTimes;     // 接收超时发生次数
    uint16_t heartBeat;         // 心跳
    CallbackFunc rxCallback;  // 接收完成后的回调，处理接收到的包
    CallbackFunc timeoutCallback;  // 接收完成后的回调，处理接收到的包
} MstObj;

void COM_objInit(MstObj *obj, uint8_t *pRx, uint16_t rxLen, uint8_t *pTx, uint16_t txLen, CallbackFunc handler, CallbackFunc timeoutCallback);
void COM_rxProcess(MstObj *obj);
void COM_txProcess(MstObj *obj);
#endif /* APP_COMM_COM_TRANSPORT_H_ */
